package composite;

import java.util.Iterator;
import java.util.Stack;

/**
 * @Author: linKe
 * @Date: 2022/1/15 9:34
 * @FileName: ComponentIterator
 * @version: 1.0
 * @Description: 外部迭代器
 *  组合的打印是内部迭代(或者说是递归)
 */
public class ComponentIterator implements Iterator<MenuComponent>{
    /**
     * 存放迭代器
     */
    private Stack<Iterator<MenuComponent>> iterators = new Stack<Iterator<MenuComponent>>();

    public ComponentIterator(Iterator<MenuComponent> iterator) {
        // 栈顶添加
        this.iterators.push(iterator);
    }

    @Override
    public boolean hasNext() {
        if(iterators.empty()) {
            return false;
        }
        // 查看此堆栈顶部的对象而不将其从堆栈中移除。
        Iterator<MenuComponent> next = iterators.peek();
        // 如果后继节点不为空 则继续遍历
        if(next.hasNext()) {
            return true;
        }else {
            // 栈顶弹出
            iterators.pop();
            // 继续递归
            return hasNext();
        }
    }

    @Override
    public MenuComponent next() {
        if(hasNext()) {
            // 查看此堆栈顶部的对象而不将其从堆栈中移除。
            Iterator<MenuComponent> next = iterators.peek();
            // 返回迭代中的下一个元素。
            MenuComponent component = next.next();
            //如果是菜单
            if(component instanceof Menu) {
                // 转换成菜单后放在栈顶
                iterators.push(((Menu) component).iterator());
                return next();
            }else {
                //
                return component;
            }
        }
        return null;
    }
}
